from datetime import datetime, timedelta

import mysql.connector
from docx import Document
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import os

print(os.getcwd())  # 输出当前工作目录

# 需要操作的数据库
database = "bhyf-rfid-server"
# 数据库连接配置
db_config = {
    'host': 'localhost',
    'port': 3306,  # 端口通常是整数类型
    'user': 'root',
    'password': 'root',
    'database': database
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# 获取所有表名
cursor.execute("SHOW TABLES")
tables = cursor.fetchall()

# 创建 Word 文档
doc = Document()


# 辅助函数：设置表格边框为黑色
def set_table_border(table):
    for row in table.rows:
        for cell in row.cells:
            # 获取 cell 的 XML
            cell_xml = cell._element
            # 设置边框样式
            for border_name in ['top', 'left', 'bottom', 'right']:
                border = OxmlElement(f'w:tcBorders')
                border.set(qn('w:space'), '0')
                border.set(qn('w:color'), '000000')  # 设置边框颜色为黑色
                border.set(qn('w:sz'), '4')  # 设置边框宽度
            cell_xml.append(border)


# 遍历每个表，生成表结构并添加到文档
for table in tables:
    table_name = table[0]
    print('Table Name:', table_name)
    # 获取表的注释
    cursor.execute(f"SELECT TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{table_name}' AND TABLE_SCHEMA = '{database}' ")
    table_info = cursor.fetchone()
    # 判断 table_info[0] 是否为空或为 None
    table_comment = table_info[0] if table_info[0] and table_info[0].strip() != '' else table_name  # 获取表的注释（第18列是Comment）
    print('table_comment Name:', table_comment)
    # 确保清空当前的查询结果
    cursor.fetchall()  # 清空可能未处理的结果集
    # 为每个表添加一个标题
    doc.add_heading(f'{table_comment} 数据库表结构', level=1)

    # 查询表结构信息
    cursor.execute(f"DESCRIBE `{table_name}`")
    columns = cursor.fetchall()

    # 确保清空当前的查询结果
    cursor.fetchall()  # 清空可能未处理的结果集

    # 创建表格：表头和列名
    table = doc.add_table(rows=1, cols=6)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = '序号'
    hdr_cells[1].text = '列名'
    hdr_cells[2].text = '数据类型'
    hdr_cells[3].text = '长度'
    hdr_cells[4].text = '说明'
    hdr_cells[5].text = '允许空'

    # 添加每一列的信息
    for index, column in enumerate(columns, start=1):
        row_cells = table.add_row().cells
        row_cells[0].text = str(index)  # 序号
        row_cells[1].text = column[0]  # 列名
        row_cells[2].text = column[1].split('(')[0]  # 数据类型
        row_cells[3].text = column[1].split('(')[-1].split(')')[0] if '(' in column[1] else ''  # 长度

        # 获取字段的注释
        cursor.execute(
            f"SELECT COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{table_name}' AND COLUMN_NAME = '{column[0]}'"
        )
        # 清空之前可能存在的结果集
        column_info = cursor.fetchone()
        column_comment = column_info[0] if column_info else ''
        cursor.fetchall()  # 清空未处理的结果集

        # 如果是主键，则说明为"主键"，否则使用字段的注释
        row_cells[4].text = '主键' if column[3] == 'PRI' else column_comment  # 如果是主键，则说明为"主键"，否则用字段的注释
        row_cells[5].text = 'YES' if column[2] == 'YES' else 'NO'  # 是否允许为空

    # 设置表格边框为黑色
    set_table_border(table)

    # 在表格后添加一个分页符
    doc.add_paragraph('\n')  # 添加空行，避免表格之间太紧

# 确保保存目录存在
if not os.path.exists('./docx'):
    os.makedirs('./docx')
# 计算今天日期
today = datetime.now()
# 保存 Word 文件
word_filename = f"./docx/{database}数据库表结构-{today.strftime('%Y-%m-%d-%H-%M-%S')}.docx"
doc.save(word_filename)
print(f"Word 文件已生成：{word_filename}")

# 关闭数据库连接
cursor.close()
conn.close()
